package com.jing.system.utils.loadresource;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.log4j.Logger;

import com.jing.system.tags.loadresource.CssTag;
import com.jing.system.tags.loadresource.JsTag;
import com.jing.system.utils.FileUtil;
import com.jing.system.utils.loadresource.handler.LoadResourceHandler;
import com.jing.system.utils.loadresource.model.Item;

/**
 * 加载资源的类
 * @author jing.yue
 * @version 1.0
 * @since 2012-10-12
 */
public class LoadResourceUtil {

	private static Logger log = Logger.getLogger(LoadResourceUtil.class);

	private static final String LOAD_RESOURCE_URL = "loadresource.properties";

	/** 是否启用了Css和Js打包 */
	public static boolean isPack = false;
	/** 打包的路径 */
	public static String packPath;

	/**
	 * 保存pack的Map集合<br>
	 * key:		压缩的对象的值[Item->value]<br>
	 * value:	压缩的对象[Item]<br>
	 */
	public static Map<String, Item> packMap = new HashMap<String, Item>();

	/**
	 * 初始化资源信息
	 * @param loadResourceUrl	加载公用配置的资源文件路径
	 * @param dirPath			项目的绝对路径
	 * @param jsCssIsPack		是否打包
	 * @return
	 */
	public static void initLoadResource(String loadResourceUrl, String dirPath, String jsCssIsPack) {
		initLoadResource(loadResourceUrl, dirPath, jsCssIsPack, null);
	}

	/**
	 * 初始化资源信息[有版本号]
	 * @param loadResourceUrl	加载公用配置的资源文件路径
	 * @param dirPath			项目的绝对路径
	 * @param jsCssIsPack		是否打包
	 * @param version			版本号
	 * @return
	 */
	public static void initLoadResource(String loadResourceUrl, String dirPath, String jsCssIsPack, String version) {
		try {
			if(loadResourceUrl == null) {
				loadResourceUrl = LOAD_RESOURCE_URL;
			}
			loadResourceUrl = Thread.currentThread().getContextClassLoader().getResource(File.separator).toString() + loadResourceUrl;
			//获取SAX工厂对象
			SAXParserFactory factory = SAXParserFactory.newInstance();

			factory.setNamespaceAware(false);
			factory.setValidating(false);

			//获取SAX解析
			SAXParser parser = factory.newSAXParser();

			//将我们的解析器对象化
			LoadResourceHandler loadResourceHandler = new LoadResourceHandler();

			//将解析器和解析对象xml联系起来,开始解析
			parser.parse(loadResourceUrl, loadResourceHandler);

			if(version == null) {
				version = "";
			}
			else {
				version = "?version=" + version;
			}

			log.info("初始化资源信息: SUCCESS");

			if(jsCssIsPack != null) {
				if("true".equals(jsCssIsPack.trim())) {
					isPack = true;
				}
				else if("false".equals(jsCssIsPack.trim())) {
					isPack = false;
				}
			}
			//打包
			if(isPack) {
				packJsCss(dirPath, version);
			}
		}
		catch (FileNotFoundException e) {
			log.error("初始化资源信息读取属性文件: 失败\t原因: 文件路径错误或者文件不存在", e);
		}
		catch (IOException e) {
			log.error("初始化资源信息装载文件: 失败\t原因: " + e.getMessage(), e);
		}
		catch (Exception e) {
			log.error("初始化资源信息异常: " + e.getMessage(), e);
		}
	}

	/**
	 * 将相应的js和css分别打包成单个文件
	 * @param dirPath	项目的绝对路径
	 * @param version	版本号
	 */
	private static void packJsCss(String dirPath, String version) {
		try {
			//得到需要打包的集合
			List<Item> items = new ArrayList<Item>();
			Iterator<Entry<String, Item>> entryKeyIterator = LoadResourceUtil.packMap.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Item> e = entryKeyIterator.next();
				items.add(e.getValue());
			}
			//处理打包的信息
			for(Item item : items) {
				String uri = File.separator + packPath + File.separator + item.getType() + File.separator + item.getName() + "." + item.getType();
				File file = FileUtil.readFile(dirPath + uri);
				StringBuffer fileString = new StringBuffer();
				Map<String, String> map = null;
				if("js".equalsIgnoreCase(item.getType())) {
					map = JsTag.jsMap;
				} else if("css".equalsIgnoreCase(item.getType())) {
					map = CssTag.cssMap;
				}
				String[] filePaths = item.getValue().split(",");
				for (String filePath : filePaths) {
					//合并文件
					FileInputStream fileinput = new FileInputStream(dirPath + File.separator + map.get(filePath));
					int fa = fileinput.available();
					byte bt[] = new byte[fa];
					fileinput.read(bt);
					fileString.append(new String(bt) + "\n");
				}
				//将内容写入文件
				FileWriter fw = new FileWriter(file);
				//将字符串写入到指定的路径下的文件中
				fw.write(fileString.toString());
				fw.close();
				if(uri.indexOf("\\") != -1 || uri.indexOf("\\\\") != -1) {
					uri = uri.replaceAll("\\\\", "/");
				}
				item.setUri(uri);
				LoadResourceUtil.packMap.put(item.getName(), item);
			}
			log.info("将js和css文件打包: SUCCESS");
		}
		catch (Exception e) {
			log.error("将js和css文件打包异常: " + e.getMessage(), e);
		}
	}

	/**
	 * 获取需要调用的集合
	 * @return
	 */
	public static List<String> getLibsArr(String libs) {
		List<String> libList = new ArrayList<String>();
		for (String lib : libs.split(",")) {
			libList.add(lib);
		}
		return libList;
	}
}
